/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package duplicateur;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JProgressBar;

/**
 *
 * @author Aurélie
 */
public class ThreadCopy extends Thread {
    protected File[] sourceFiles;
    protected File dossier;
    protected JProgressBar progress;
    protected long lectureFichier;
    protected InterfaceDuplicateur interfaceD;
    
    public ThreadCopy(final File[] sourceFiles, final File dossier, JProgressBar progressCurrent, InterfaceDuplicateur interfaceD) {
        this.sourceFiles = sourceFiles;
        this.dossier = dossier;
        this.progress = progressCurrent;
        this.lectureFichier = 0;
        this.interfaceD = interfaceD;
    }
    
    public void copy(File source, File destination, long filesSize) {

        try {
            FileInputStream in = null;
            int nbRead;
            byte[] buffer = new byte[262144];
            Long positionFichier = new Long(0);
            
            if (!source.isDirectory()) {
                //Création du flux d'entrée
                in = new FileInputStream(source);

                //Création du fichier de destination
                destination = new File(destination.getAbsolutePath()+"/"+source.getName());

                //Création du flux de sortie
                FileOutputStream out = new FileOutputStream(destination);

                try {
                    //Tant qu'il reste des données à copier
                    while ((nbRead = in.read(buffer)) != -1) {
                        this.lectureFichier += nbRead;
                        positionFichier = new Long(((this.lectureFichier * 100) / filesSize));
                        progress.setValue(positionFichier.intValue());                        
                        out.write(buffer, 0, nbRead);
                    }
                } finally {
                    try {
                        out.close();
                        in.close();
                    } catch (IOException ex) {
                        Logger.getLogger(ThreadCopy.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            } else {
                File sousDossier = new File(destination.getAbsolutePath()+"/"+source.getName());
                if(!sousDossier.exists()) {
                    sousDossier.mkdir();
                }
                for (File file : source.listFiles()) {
                    copy(file, sousDossier, filesSize);
                }
            }
            
        }   catch (Exception ex) {
            Logger.getLogger(ThreadCopy.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }
    
    public void run() {
        long filesSize = 0;
        long lectureFichier = 0;
        try {
            //Parcours des fichiers sources
            for (File f : sourceFiles) {
                //Récupère la taille des fichiers
                filesSize += getFilesSize(f);
            }
            //Parcours des fichiers
            for (File sourceFile : sourceFiles) {
                //Copie les fichiers dans le dossier
                  copy(sourceFile, this.dossier, filesSize);
            }
            interfaceD.getJTextAreaEtat().setText(interfaceD.getJTextAreaEtat().getText()+"\n Copie terminée sur "+this.dossier.getPath());
            interfaceD.getJTextAreaEtat().setCaretPosition(interfaceD.getJTextAreaEtat().getDocument().getLength());
            interfaceD.addNbThreadEnd();
            this.interrupt();
            //this.stop();
            
        } catch (Exception ex) {
            Logger.getLogger(ThreadCopy.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public long getFilesSize(File file) {
        long taille = 0;
        
        //Vérifie si le fichier est un répertoire
        if (!file.isDirectory()) {
            //Retourne la taille du fichier
            return file.length();
        } else {
            //Parcours les fichiers du dossier
            for (File sousFile : file.listFiles()) {
                //Récupère la taille des fichiers
                taille += getFilesSize(sousFile);
            }
            //Retourne la taille des fichiers du dossier
            return taille;
        }
    }
}
